import requests
from bs4 import BeautifulSoup


def get_web_content(url):
    """获取指定URL的网页内容"""
    try:
        # 添加用户代理，模拟浏览器访问
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
            'Accept-Language': 'zh-CN,zh;q=0.9'
        }

        # 发送GET请求
        response = requests.get(url, headers=headers, timeout=10)

        # 检查请求是否成功
        response.raise_for_status()

        # 设置正确的编码
        response.encoding = response.apparent_encoding

        return True, response.text

    except requests.exceptions.MissingSchema:
        # 处理缺少http/https的情况
        return False, "URL格式错误，请确保包含http://或https://"
    except requests.exceptions.ConnectionError:
        return False, "连接错误，无法连接到服务器"
    except requests.exceptions.Timeout:
        return False, "请求超时"
    except requests.exceptions.HTTPError as e:
        return False, f"HTTP错误: {str(e)}"
    except Exception as e:
        return False, f"发生错误: {str(e)}"


def extract_elements_with_class(html_content, class_name):
    """从HTML内容中提取指定类的元素"""
    soup = BeautifulSoup(html_content, 'html.parser')
    # 查找所有具有指定class的元素
    elements = soup.find_all(class_=class_name)
    return elements


# def main():
#     print("网页特定元素查看器")
#     print("-" * 30)
#
#     # 注意：请替换为有效的URL
#     base_url = "https://avfan.com/zh-CN/search?q=绝对领域"  # 这里使用了示例URL，请替换为你要访问的实际URL
#     target_class = "flex flex-col relative hover:bg-zinc-100 hover:dark:bg-zinc-800"
#     print(f"正在访问: {base_url}")
#     print(f"将提取class为 '{target_class}' 的元素内容\n")
#
#     # 获取用户输入的页码范围
#     while True:
#         try:
#             start_page = int(input("请输入开始页码: "))
#             end_page = int(input("请输入结束页码: "))
#             if start_page > 0 and end_page >= start_page:
#                 break
#             print("页码输入错误，请确保开始页码大于0且结束页码不小于开始页码")
#         except ValueError:
#             print("请输入有效的数字")
#
#     print(f"正在访问: {base_url} (页码范围: {start_page}-{end_page})")
#     print(f"将提取class为 '{target_class}' 的元素内容\n")
#
#     # 循环处理每个页面
#     for page in range(start_page, end_page + 1):
#         print(f"\n===== 正在处理第 {page} 页 =====")
#
#         # 构建带分页参数的URL
#         url = f"{base_url}&page={page}"
#
#         # 获取网页内容
#         success, content = get_web_content(url)
#
#         if success:
#             # 提取指定类的元素
#             elements = extract_elements_with_class(content, target_class)
#
#             if elements:
#                 print(f"共找到 {len(elements)} 个匹配的元素:")
#                 print("-" * 60)
#
#                 for i, element in enumerate(elements, 1):
#                     print(f"\n元素 {i}:")
#                     print("-" * 40)
#                     # 查找当前元素及其所有子元素中带有title属性的标签
#                     title_tags = element.find_all(attrs={"title": True})
#
#                     if title_tags:
#                         unique_titles = list({tag['title'] for tag in title_tags})
#                         print(f"找到的title属性: {unique_titles[0]}")
#                     else:
#                         print("未找到任何title属性")
#
#                     print("-" * 40)
#                     # 查找src属性
#                     src_tags = element.find_all(attrs={"src": True})
#                     if src_tags:
#                         for tag in src_tags:
#                             print(f"标签 <{tag.name}> 的src: {tag['src']}")
#                     else:
#                         print("未找到任何src属性")
#
#                     print("-" * 40)
#             else:
#                 print(f"未找到class为 '{target_class}' 的元素")
#         else:
#             print(f"\n错误: {content}")

def main():
    print("网页特定元素查看器")
    print("-" * 30)

    # 1. 获取用户输入的多个关键词（主关键词+筛选关键词）
    while True:
        keyword_input = input("请输入关键词（用英文逗号分隔，第一个为主关键词，后续为title筛选词）：")
        # 去除空格并拆分关键词，避免空输入
        keywords = [kw.strip() for kw in keyword_input.split(",") if kw.strip()]
        if len(keywords) >= 1:  # 至少需要1个主关键词
            break
        print("请至少输入1个关键词（例：学习,英语 表示主关键词为学习，title需包含英语）")

    # 拆分关键词：第一个为主关键词（拼URL），剩余为title筛选词
    main_keyword = keywords[0]
    filter_keywords = keywords[1:]  # 若用户只输1个，这里为空列表（不筛选）

    # 2. 构建带主关键词的基础URL（替换原固定URL）
    base_url = f"https://avfan.com/zh-CN/search?q={main_keyword}"
    target_class = "flex flex-col relative hover:bg-zinc-100 hover:dark:bg-zinc-800"
    print(f"主搜索关键词：{main_keyword}")
    if filter_keywords:
        print(f"Title筛选关键词：{', '.join(filter_keywords)}")
    print(f"基础URL：{base_url}")
    print(f"将提取class为 '{target_class}' 的元素内容\n")

    # 3. （原有逻辑保留）获取页码范围
    while True:
        try:
            start_page = int(input("请输入开始页码: "))
            end_page = int(input("请输入结束页码: "))
            if start_page > 0 and end_page >= start_page:
                break
            print("页码输入错误，请确保开始页码大于0且结束页码不小于开始页码")
        except ValueError:
            print("请输入有效的数字")

    print(f"正在访问: {base_url} (页码范围: {start_page}-{end_page})")
    if filter_keywords:
        print(f"仅保留Title包含以下所有关键词的元素：{', '.join(filter_keywords)}")
    print("\n" + "-" * 60 + "\n")

    # 4. （原有循环保留）处理每个页面，新增title筛选逻辑
    for page in range(start_page, end_page + 1):
        print(f"===== 正在处理第 {page} 页 =====")
        url = f"{base_url}&page={page}"
        success, content = get_web_content(url)

        if success:
            elements = extract_elements_with_class(content, target_class)
            if elements:
                # 新增：筛选出title包含所有筛选关键词的元素
                filtered_elements = []
                for elem in elements:
                    title_tags = elem.find_all(attrs={"title": True})
                    if title_tags:
                        # 获取当前元素的title（去重后取第一个）
                        elem_title = list({tag['title'] for tag in title_tags})[0]
                        # 检查：是否包含所有筛选关键词（不区分大小写，更灵活）
                        if all(keyword.lower() in elem_title.lower() for keyword in filter_keywords):
                            filtered_elements.append(elem)
                    # 若元素无title，直接排除（因无法筛选）

                # 输出筛选后的结果
                print(f"第{page}页原始匹配元素：{len(elements)}个 | 筛选后匹配元素：{len(filtered_elements)}个")
                if filtered_elements:
                    print("-" * 60)
                    for i, element in enumerate(filtered_elements, 1):
                        print(f"\n元素 {i}:")
                        print("-" * 40)
                        # （原有逻辑保留）提取并打印title和src
                        title_tags = element.find_all(attrs={"title": True})
                        if title_tags:
                            unique_titles = list({tag['title'] for tag in title_tags})
                            print(f"找到的title属性: {unique_titles[0]}")
                        else:
                            print("未找到任何title属性")

                        print("-" * 40)
                        src_tags = element.find_all(attrs={"src": True})
                        if src_tags:
                            for tag in src_tags:
                                print(f"标签 <{tag.name}> 的src: {tag['src']}")
                        else:
                            print("未找到任何src属性")
                        print("-" * 40)
                else:
                    print("筛选后无匹配元素\n")
            else:
                print(f"第{page}页未找到class为 '{target_class}' 的元素\n")
        else:
            print(f"第{page}页错误: {content}\n")
if __name__ == "__main__":
    main()
